/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package doghost.entities;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.Transient;

/**
 *
 * @author duo
 */
@Entity
public class Hospedagem implements Serializable {
    @Transient
    private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "hospedagem")
    private List<ItemDeHospedagem> itensDeHospedagem;
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @ManyToOne
    protected Animal animal;
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    protected Date inicio;
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    protected Date fim;
    @Temporal(javax.persistence.TemporalType.DATE)
    protected Date faturamento;
    protected Double valor;
    protected Double desconto;
    protected Double juros;
    @Temporal(javax.persistence.TemporalType.DATE)
    protected Date pagamento;
    protected Integer diarias;
    protected Double valorDiaria;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        Long oldId = this.id;
        this.id = id;
        changeSupport.firePropertyChange("id", oldId, id);
    }

    /**
     * Get the value of animal
     *
     * @return the value of animal
     */
    public Animal getAnimal() {
        return animal;
    }

    /**
     * Set the value of animal
     *
     * @param animal new value of animal
     */
    public void setAnimal(Animal animal) {
        Animal oldAnimal = this.animal;
        this.animal = animal;
        changeSupport.firePropertyChange("animal", oldAnimal, animal);
    }

    /**
     * Get the value of inicio
     *
     * @return the value of inicio
     */
    public Date getInicio() {
        return inicio;
    }

    /**
     * Set the value of inicio
     *
     * @param inicio new value of inicio
     */
    public void setInicio(Date inicio) {
        Date oldInicio = this.inicio;
        this.inicio = inicio;
        changeSupport.firePropertyChange("inicio", oldInicio, inicio);
    }

    /**
     * Get the value of fim
     *
     * @return the value of fim
     */
    public Date getFim() {
        return fim;
    }

    /**
     * Set the value of fim
     *
     * @param fim new value of fim
     */
    public void setFim(Date fim) {
        Date oldFim = this.fim;
        this.fim = fim;
        changeSupport.firePropertyChange("fim", oldFim, fim);
    }

    public List<ItemDeHospedagem> getItensDeHospedagem() {
        return itensDeHospedagem;
    }

    public void setItensDeHospedagem(List<ItemDeHospedagem> itensDeHospedagem) {
        setItensDeHospedagem(itensDeHospedagem, false);
    }

    public void setItensDeHospedagem(List<ItemDeHospedagem> itensDeHospedagem, boolean force) {
        List<ItemDeHospedagem> oldItensDeHospedagem = this.itensDeHospedagem;
        if(force) {
            oldItensDeHospedagem = null;
        }
        this.itensDeHospedagem = itensDeHospedagem;
        changeSupport.firePropertyChange("itensDeHospedagem", oldItensDeHospedagem, itensDeHospedagem);
    }

    /**
     * Get the value of valor
     *
     * @return the value of valor
     */
    public Double getValor() {
        return valor;
    }

    /**
     * Set the value of valor
     *
     * @param valor new value of valor
     */
    public void setValor(Double valor) {
        Double oldValor = this.valor;
        this.valor = valor;
        changeSupport.firePropertyChange("valor", oldValor, valor);
    }

    /**
     * Get the value of desconto
     *
     * @return the value of desconto
     */
    public Double getDesconto() {
        return desconto;
    }

    /**
     * Set the value of desconto
     *
     * @param desconto new value of desconto
     */
    public void setDesconto(Double desconto) {
        Double oldDesconto = this.desconto;
        this.desconto = desconto;
        changeSupport.firePropertyChange("desconto", oldDesconto, desconto);
    }

    /**
     * Get the value of juros
     *
     * @return the value of juros
     */
    public Double getJuros() {
        return juros;
    }

    /**
     * Set the value of juros
     *
     * @param juros new value of juros
     */
    public void setJuros(Double juros) {
        Double oldJuros = this.juros;
        this.juros = juros;
        changeSupport.firePropertyChange("juros", oldJuros, juros);
    }

    /**
     * Get the value of pagamento
     *
     * @return the value of pagamento
     */
    public Date getPagamento() {
        return pagamento;
    }

    /**
     * Set the value of pagamento
     *
     * @param pagamento new value of pagamento
     */
    public void setPagamento(Date pagamento) {
        Date oldPagamento = this.pagamento;
        this.pagamento = pagamento;
        changeSupport.firePropertyChange("pagamento", oldPagamento, pagamento);
    }

    /**
     * Get the value of pagamento
     *
     * @return the value of pagamento
     */
    public Date getFaturamento() {
        return faturamento;
    }

    /**
     * Set the value of faturamento
     *
     * @param faturamento new value of faturamento
     */
    public void setFaturamento(Date faturamento) {
        Date oldFaturamento = this.faturamento;
        this.faturamento = faturamento;
        changeSupport.firePropertyChange("faturamento", oldFaturamento, faturamento);
    }

    /**
     * Get the value of diarias
     *
     * @return the value of diarias
     */
    public Integer getDiarias() {
        return diarias;
    }

    /**
     * Set the value of diarias
     *
     * @param diarias new value of diarias
     */
    public void setDiarias(Integer diarias) {
        Integer oldDiarias = this.diarias;
        this.diarias = diarias;
        changeSupport.firePropertyChange("diarias", oldDiarias, diarias);
    }

    /**
     * Get the value of valorDiaria
     *
     * @return the value of valorDiaria
     */
    public Double getValorDiaria() {
        return valorDiaria;
    }

    /**
     * Set the value of valorDiaria
     *
     * @param valorDiaria new value of valorDiaria
     */
    public void setValorDiaria(Double valorDiaria) {
        Double oldValorDiaria = this.valorDiaria;
        this.valorDiaria = valorDiaria;
        changeSupport.firePropertyChange("valorDiaria", oldValorDiaria, valorDiaria);
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Hospedagem)) {
            return false;
        }
        Hospedagem other = (Hospedagem) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Hospedagem[animal: " + this.getAnimal() + " em: " +
                new java.text.SimpleDateFormat("dd/MM/yyyy").format(this.getInicio()) + "]";
    }

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        changeSupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        changeSupport.removePropertyChangeListener(listener);
    }

}
